__author__ = "TheCjw"

_ENV_OBJECT = 0x0000ABE0

env_names_list = [
    "jni_env_GetVersion",
    "jni_env_DefineClass",
    "jni_env_FindClass",
    "jni_env_FromReflectedMethod",
    "jni_env_FromReflectedField",
    "jni_env_ToReflectedMethod",
    "jni_env_GetSuperclass",
    "jni_env_IsAssignableFrom",
    "jni_env_ToReflectedField",
    "jni_env_Throw",
    "jni_env_ThrowNew",
    "jni_env_ExceptionOccurred",
    "jni_env_ExceptionDescribe",
    "jni_env_ExceptionClear",
    "jni_env_FatalError",
    "jni_env_PushLocalFrame",
    "jni_env_PopLocalFrame",
    "jni_env_NewGlobalRef",
    "jni_env_DeleteGlobalRef",
    "jni_env_DeleteLocalRef",
    "jni_env_IsSameObject",
    "jni_env_NewLocalRef",
    "jni_env_EnsureLocalCapacity",
    "jni_env_AllocObject",
    "jni_env_NewObject",
    "jni_env_NewObjectV",
    "jni_env_NewObjectA",
    "jni_env_GetObjectClass",
    "jni_env_IsInstanceOf",
    "jni_env_GetMethodID",
    "jni_env_CallObjectMethod",
    "jni_env_CallObjectMethodV",
    "jni_env_CallObjectMethodA",
    "jni_env_CallBooleanMethod",
    "jni_env_CallBooleanMethodV",
    "jni_env_CallBooleanMethodA",
    "jni_env_CallByteMethod",
    "jni_env_CallByteMethodV",
    "jni_env_CallByteMethodA",
    "jni_env_CallCharMethod",
    "jni_env_CallCharMethodV",
    "jni_env_CallCharMethodA",
    "jni_env_CallShortMethod",
    "jni_env_CallShortMethodV",
    "jni_env_CallShortMethodA",
    "jni_env_CallIntMethod",
    "jni_env_CallIntMethodV",
    "jni_env_CallIntMethodA",
    "jni_env_CallLongMethod",
    "jni_env_CallLongMethodV",
    "jni_env_CallLongMethodA",
    "jni_env_CallFloatMethod",
    "jni_env_CallFloatMethodV",
    "jni_env_CallFloatMethodA",
    "jni_env_CallDoubleMethod",
    "jni_env_CallDoubleMethodV",
    "jni_env_CallDoubleMethodA",
    "jni_env_CallVoidMethod",
    "jni_env_CallVoidMethodV",
    "jni_env_CallVoidMethodA",
    "jni_env_CallNonvirtualObjectMethod",
    "jni_env_CallNonvirtualObjectMethodV",
    "jni_env_CallNonvirtualObjectMethodA",
    "jni_env_CallNonvirtualBooleanMethod",
    "jni_env_CallNonvirtualBooleanMethodV",
    "jni_env_CallNonvirtualBooleanMethodA",
    "jni_env_CallNonvirtualByteMethod",
    "jni_env_CallNonvirtualByteMethodV",
    "jni_env_CallNonvirtualByteMethodA",
    "jni_env_CallNonvirtualCharMethod",
    "jni_env_CallNonvirtualCharMethodV",
    "jni_env_CallNonvirtualCharMethodA",
    "jni_env_CallNonvirtualShortMethod",
    "jni_env_CallNonvirtualShortMethodV",
    "jni_env_CallNonvirtualShortMethodA",
    "jni_env_CallNonvirtualIntMethod",
    "jni_env_CallNonvirtualIntMethodV",
    "jni_env_CallNonvirtualIntMethodA",
    "jni_env_CallNonvirtualLongMethod",
    "jni_env_CallNonvirtualLongMethodV",
    "jni_env_CallNonvirtualLongMethodA",
    "jni_env_CallNonvirtualFloatMethod",
    "jni_env_CallNonvirtualFloatMethodV",
    "jni_env_CallNonvirtualFloatMethodA",
    "jni_env_CallNonvirtualDoubleMethod",
    "jni_env_CallNonvirtualDoubleMethodV",
    "jni_env_CallNonvirtualDoubleMethodA",
    "jni_env_CallNonvirtualVoidMethod",
    "jni_env_CallNonvirtualVoidMethodV",
    "jni_env_CallNonvirtualVoidMethodA",
    "jni_env_GetFieldID",
    "jni_env_GetObjectField",
    "jni_env_GetBooleanField",
    "jni_env_GetByteField",
    "jni_env_GetCharField",
    "jni_env_GetShortField",
    "jni_env_GetIntField",
    "jni_env_GetLongField",
    "jni_env_GetFloatField",
    "jni_env_GetDoubleField",
    "jni_env_SetObjectField",
    "jni_env_SetBooleanField",
    "jni_env_SetByteField",
    "jni_env_SetCharField",
    "jni_env_SetShortField",
    "jni_env_SetIntField",
    "jni_env_SetLongField",
    "jni_env_SetFloatField",
    "jni_env_SetDoubleField",
    "jni_env_GetStaticMethodID",
    "jni_env_CallStaticObjectMethod",
    "jni_env_CallStaticObjectMethodV",
    "jni_env_CallStaticObjectMethodA",
    "jni_env_CallStaticBooleanMethod",
    "jni_env_CallStaticBooleanMethodV",
    "jni_env_CallStaticBooleanMethodA",
    "jni_env_CallStaticByteMethod",
    "jni_env_CallStaticByteMethodV",
    "jni_env_CallStaticByteMethodA",
    "jni_env_CallStaticCharMethod",
    "jni_env_CallStaticCharMethodV",
    "jni_env_CallStaticCharMethodA",
    "jni_env_CallStaticShortMethod",
    "jni_env_CallStaticShortMethodV",
    "jni_env_CallStaticShortMethodA",
    "jni_env_CallStaticIntMethod",
    "jni_env_CallStaticIntMethodV",
    "jni_env_CallStaticIntMethodA",
    "jni_env_CallStaticLongMethod",
    "jni_env_CallStaticLongMethodV",
    "jni_env_CallStaticLongMethodA",
    "jni_env_CallStaticFloatMethod",
    "jni_env_CallStaticFloatMethodV",
    "jni_env_CallStaticFloatMethodA",
    "jni_env_CallStaticDoubleMethod",
    "jni_env_CallStaticDoubleMethodV",
    "jni_env_CallStaticDoubleMethodA",
    "jni_env_CallStaticVoidMethod",
    "jni_env_CallStaticVoidMethodV",
    "jni_env_CallStaticVoidMethodA",
    "jni_env_GetStaticFieldID",
    "jni_env_GetStaticObjectField",
    "jni_env_GetStaticBooleanField",
    "jni_env_GetStaticByteField",
    "jni_env_GetStaticCharField",
    "jni_env_GetStaticShortField",
    "jni_env_GetStaticIntField",
    "jni_env_GetStaticLongField",
    "jni_env_GetStaticFloatField",
    "jni_env_GetStaticDoubleField",
    "jni_env_SetStaticObjectField",
    "jni_env_SetStaticBooleanField",
    "jni_env_SetStaticByteField",
    "jni_env_SetStaticCharField",
    "jni_env_SetStaticShortField",
    "jni_env_SetStaticIntField",
    "jni_env_SetStaticLongField",
    "jni_env_SetStaticFloatField",
    "jni_env_SetStaticDoubleField",
    "jni_env_NewString",
    "jni_env_GetStringLength",
    "jni_env_GetStringChars",
    "jni_env_ReleaseStringChars",
    "jni_env_NewStringUTF",
    "jni_env_GetStringUTFLength",
    "jni_env_GetStringUTFChars",
    "jni_env_ReleaseStringUTFChars",
    "jni_env_GetArrayLength",
    "jni_env_NewObjectArray",
    "jni_env_GetObjectArrayElement",
    "jni_env_SetObjectArrayElement",
    "jni_env_NewBooleanArray",
    "jni_env_NewByteArray",
    "jni_env_NewCharArray",
    "jni_env_NewShortArray",
    "jni_env_NewIntArray",
    "jni_env_NewLongArray",
    "jni_env_NewFloatArray",
    "jni_env_NewDoubleArray",
    "jni_env_GetBooleanArrayElements",
    "jni_env_GetByteArrayElements",
    "jni_env_GetCharArrayElements",
    "jni_env_GetShortArrayElements",
    "jni_env_GetIntArrayElements",
    "jni_env_GetLongArrayElements",
    "jni_env_GetFloatArrayElements",
    "jni_env_GetDoubleArrayElements",
    "jni_env_ReleaseBooleanArrayElements",
    "jni_env_ReleaseByteArrayElements",
    "jni_env_ReleaseCharArrayElements",
    "jni_env_ReleaseShortArrayElements",
    "jni_env_ReleaseIntArrayElements",
    "jni_env_ReleaseLongArrayElements",
    "jni_env_ReleaseFloatArrayElements",
    "jni_env_ReleaseDoubleArrayElements",
    "jni_env_GetBooleanArrayRegion",
    "jni_env_GetByteArrayRegion",
    "jni_env_GetCharArrayRegion",
    "jni_env_GetShortArrayRegion",
    "jni_env_GetIntArrayRegion",
    "jni_env_GetLongArrayRegion",
    "jni_env_GetFloatArrayRegion",
    "jni_env_GetDoubleArrayRegion",
    "jni_env_SetBooleanArrayRegion",
    "jni_env_SetByteArrayRegion",
    "jni_env_SetCharArrayRegion",
    "jni_env_SetShortArrayRegion",
    "jni_env_SetIntArrayRegion",
    "jni_env_SetLongArrayRegion",
    "jni_env_SetFloatArrayRegion",
    "jni_env_SetDoubleArrayRegion",
    "jni_env_RegisterNatives",
    "jni_env_UnregisterNatives",
    "jni_env_MonitorEnter",
    "jni_env_MonitorExit",
    "jni_env_GetJavaVM",
    "jni_env_GetStringRegion",
    "jni_env_GetStringUTFRegion",
    "jni_env_GetPrimitiveArrayCritical",
    "jni_env_ReleasePrimitiveArrayCritical",
    "jni_env_GetStringCritical",
    "jni_env_ReleaseStringCritical",
    "jni_env_NewWeakGlobalRef",
    "jni_env_DeleteWeakGlobalRef",
    "jni_env_ExceptionCheck",
    "jni_env_NewDirectByteBuffer",
    "jni_env_GetDirectBufferAddress",
    "jni_env_GetDirectBufferCapacity",
    "jni_env_GetObjectRefType"
]


def main():
    table = Dword(_ENV_OBJECT)
    base = table + 0x4 * 4
    end = table + 0x4 * 233
    functions_list = [Dword(address) & 0xFFFFFFFFFFFFFFE for address in range(base, end, 4)]
    for i in xrange(0, len(env_names_list)):
        MakeFunction(functions_list[i])
        MakeName(functions_list[i], env_names_list[i])


if __name__ == "__main__":
    main()